/*
 *  Copyright (C) 2011 Alvaro Duran Tovar
 *
 *  This file is part of AFA.
 *
 *  AFA is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */


/*
 * NewJFrame.java
 *
 * Created on Sep 17, 2009, 9:32:13 PM
 */
package afa.view;

import afa.control.*;
import afa.control.analisis.Analisis;
import afa.control.net.DownloadsHandler;
import afa.control.plugins.PluginsManager;
import afa.model.*;
import java.awt.*;
import java.io.File;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.tree.*;

/**
 *
 * @author Alvaro Duran Tovar
 */
public class Window extends javax.swing.JFrame {

    private int panelSelected = 0;
    private JPanel[] panels;
    public String _text;
    private boolean omitCheckStep = false;
    private FirstStepPanel firstStepPanel = new FirstStepPanel();
    private DeviceSelectionPanel deviceSelectionPanel = new DeviceSelectionPanel();
    private PluginSelectionPanel pluginSelectionPanel = new PluginSelectionPanel();
    private IgnoreOptionsPanel ignoreOptionsPanel = new IgnoreOptionsPanel();
    private AnalisisFeedbackPanel analisisFeedbackPanel = new AnalisisFeedbackPanel();

    /** Creates new form NewJFrame */
    public Window() throws Exception {
        initComponents();

        panels = new JPanel[]{firstStepPanel, deviceSelectionPanel,
            pluginSelectionPanel, ignoreOptionsPanel, analisisFeedbackPanel};
        

        //center on screen
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        setLocation((int) (dim.getWidth() / 2) - (this.getWidth() / 2), (int) (dim.getHeight() / 2) - (this.getHeight() / 2));

        //para que las colunmnas esten centradas
        DefaultTableCellRenderer cell = new DefaultTableCellRenderer();
        cell.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);
        jTable1.setDefaultRenderer(Object.class, cell);

        //
        jTable1.setRowHeight(22);


        //asignar renderizador de boton
        new MyButtonCell(this.jTable1, this, 3);

        stepsPanel.add(firstStepPanel, java.awt.BorderLayout.CENTER);

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPopupMenu1 = new javax.swing.JPopupMenu();
        jMenuItem5 = new javax.swing.JMenuItem();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        nextButton = new javax.swing.JButton();
        cancelButton = new javax.swing.JButton();
        stepsPanel = new javax.swing.JPanel();
        startButton = new javax.swing.JButton();
        previousButton = new javax.swing.JButton();
        updatePanel = new javax.swing.JPanel();
        jScrollPane6 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jButton12 = new javax.swing.JButton();
        jLabel16 = new javax.swing.JLabel();
        jButton7 = new javax.swing.JButton();
        jComboBox1 = new javax.swing.JComboBox();
        jProgressBar3 = new javax.swing.JProgressBar();
        jProgressBar3.setVisible(false);
        pluginsPanel = new javax.swing.JPanel();
        jScrollPane4 = new javax.swing.JScrollPane();
        jTree2 = new javax.swing.JTree();
        jTextField1 = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        jLabel12 = new javax.swing.JLabel();
        jTextField5 = new javax.swing.JTextField();
        jTextField6 = new javax.swing.JTextField();
        jTextField3 = new javax.swing.JTextField();
        jTextField4 = new javax.swing.JTextField();
        jLabel17 = new javax.swing.JLabel();
        jTextField7 = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jButton1 = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextArea2 = new javax.swing.JTextArea();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem4 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenu3 = new javax.swing.JMenu();
        jMenuItem2 = new javax.swing.JMenuItem();
        jSeparator6 = new javax.swing.JSeparator();
        jMenuItem3 = new javax.swing.JMenuItem();

        jMenuItem5.setText("Borrar");
        jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem5ActionPerformed(evt);
            }
        });
        jPopupMenu1.add(jMenuItem5);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("AFA v2.0");
        setMinimumSize(new java.awt.Dimension(10, 63));
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
        });

        jTabbedPane1.setMinimumSize(new java.awt.Dimension(10, 81));
        jTabbedPane1.setPreferredSize(new java.awt.Dimension(703, 550));
        jTabbedPane1.addMouseWheelListener(new java.awt.event.MouseWheelListener() {
            public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) {
                jTabbedPane1MouseWheelMoved(evt);
            }
        });
        jTabbedPane1.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                jTabbedPane1StateChanged(evt);
            }
        });

        jPanel1.setPreferredSize(new java.awt.Dimension(633, 572));

        nextButton.setText("Siguiente >");
        nextButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                nextButtonActionPerformed(evt);
            }
        });

        cancelButton.setText("Cancelar");
        cancelButton.setEnabled(false);
        cancelButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cancelButtonActionPerformed(evt);
            }
        });

        stepsPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        stepsPanel.setLayout(new java.awt.BorderLayout());

        startButton.setText("Iniciar");
        startButton.setEnabled(false);
        startButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                startButtonActionPerformed(evt);
            }
        });

        previousButton.setText("< Anterior");
        previousButton.setEnabled(false);
        previousButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                previousButtonActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(stepsPanel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 672, Short.MAX_VALUE)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(startButton)
                        .addGap(200, 200, 200)
                        .addComponent(previousButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(nextButton)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 188, Short.MAX_VALUE)
                        .addComponent(cancelButton)))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(stepsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 354, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(startButton)
                    .addComponent(previousButton)
                    .addComponent(nextButton)
                    .addComponent(cancelButton))
                .addGap(8, 8, 8))
        );

        jTabbedPane1.addTab("Analisis", jPanel1);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Nombre", "Category", "Last updated", "Accion"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.Object.class
            };
            boolean[] canEdit = new boolean [] {
                false, false, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jTable1.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_LAST_COLUMN);
        jTable1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jScrollPane6.setViewportView(jTable1);

        jButton12.setText("Buscar actualizaciones");
        jButton12.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton12ActionPerformed(evt);
            }
        });

        jLabel16.setLabelFor(jComboBox1);
        jLabel16.setText("Accion:");

        jButton7.setText("Ejecutar en todos");

        jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Actualizar & Instalar", "Actualizar", "Instalar" }));

        jProgressBar3.setIndeterminate(true);

        javax.swing.GroupLayout updatePanelLayout = new javax.swing.GroupLayout(updatePanel);
        updatePanel.setLayout(updatePanelLayout);
        updatePanelLayout.setHorizontalGroup(
            updatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, updatePanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(updatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane6, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 672, Short.MAX_VALUE)
                    .addGroup(updatePanelLayout.createSequentialGroup()
                        .addComponent(jButton12)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 38, Short.MAX_VALUE)
                        .addComponent(jProgressBar3, javax.swing.GroupLayout.DEFAULT_SIZE, 85, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jLabel16)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, 181, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButton7)))
                .addContainerGap())
        );
        updatePanelLayout.setVerticalGroup(
            updatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, updatePanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane6, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(updatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, updatePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jLabel16)
                        .addComponent(jButton12, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addComponent(jComboBox1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jProgressBar3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButton7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );

        jTabbedPane1.addTab("Actualizacion", updatePanel);

        javax.swing.tree.DefaultMutableTreeNode treeNode1 = new javax.swing.tree.DefaultMutableTreeNode("/");
        jTree2.setModel(new javax.swing.tree.DefaultTreeModel(treeNode1));
        jTree2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                jTree2MousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                jTree2MouseReleased(evt);
            }
        });
        jTree2.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            public void valueChanged(javax.swing.event.TreeSelectionEvent evt) {
                jTree2ValueChanged(evt);
            }
        });
        jScrollPane4.setViewportView(jTree2);

        jTextField1.setToolTipText("Filter");
        jTextField1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField1ActionPerformed(evt);
            }
        });

        jLabel7.setLabelFor(jTextField3);
        jLabel7.setText("Nombre");

        jLabel8.setLabelFor(jTextField4);
        jLabel8.setText("SO");

        jLabel9.setLabelFor(jTextField6);
        jLabel9.setText("Last Updated");

        jLabel10.setText("Descripcion");

        jLabel12.setLabelFor(jTextField5);
        jLabel12.setText("Categoria");

        jTextField5.setEditable(false);

        jTextField6.setEditable(false);

        jTextField3.setEditable(false);

        jTextField4.setEditable(false);

        jLabel17.setText("Autor");

        jTextField7.setEditable(false);

        jLabel1.setText("Tags");

        jTextArea1.setColumns(20);
        jTextArea1.setEditable(false);
        jTextArea1.setLineWrap(true);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        jButton1.setText("Add Filter");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/afa/view/icons/clear.png"))); // NOI18N
        jLabel2.setToolTipText("Clear filter");
        jLabel2.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jLabel2MouseClicked(evt);
            }
        });

        jTextArea2.setColumns(20);
        jTextArea2.setLineWrap(true);
        jTextArea2.setRows(5);
        jScrollPane2.setViewportView(jTextArea2);

        javax.swing.GroupLayout pluginsPanelLayout = new javax.swing.GroupLayout(pluginsPanel);
        pluginsPanel.setLayout(pluginsPanelLayout);
        pluginsPanelLayout.setHorizontalGroup(
            pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pluginsPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 325, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pluginsPanelLayout.createSequentialGroup()
                        .addComponent(jButton1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 230, Short.MAX_VALUE)
                        .addGap(0, 0, 0)
                        .addComponent(jLabel2)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 335, Short.MAX_VALUE)
                    .addGroup(pluginsPanelLayout.createSequentialGroup()
                        .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel9)
                            .addComponent(jLabel17)
                            .addComponent(jLabel7)
                            .addComponent(jLabel8)
                            .addComponent(jLabel12))
                        .addGap(24, 24, 24)
                        .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jTextField5, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 223, Short.MAX_VALUE)
                            .addComponent(jTextField6, javax.swing.GroupLayout.DEFAULT_SIZE, 223, Short.MAX_VALUE)
                            .addComponent(jTextField3, javax.swing.GroupLayout.DEFAULT_SIZE, 223, Short.MAX_VALUE)
                            .addComponent(jTextField4, javax.swing.GroupLayout.DEFAULT_SIZE, 223, Short.MAX_VALUE)
                            .addComponent(jTextField7, javax.swing.GroupLayout.DEFAULT_SIZE, 223, Short.MAX_VALUE)))
                    .addComponent(jLabel10)
                    .addComponent(jLabel1)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 335, Short.MAX_VALUE))
                .addContainerGap())
        );
        pluginsPanelLayout.setVerticalGroup(
            pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pluginsPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jLabel7))
                    .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 25, Short.MAX_VALUE)
                        .addComponent(jButton1))
                    .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(pluginsPanelLayout.createSequentialGroup()
                        .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jTextField4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel8))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jTextField5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel12))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel9)
                            .addComponent(jTextField6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(pluginsPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jTextField7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel17))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel10)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 225, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 29, Short.MAX_VALUE))
                    .addComponent(jScrollPane4, javax.swing.GroupLayout.DEFAULT_SIZE, 430, Short.MAX_VALUE))
                .addContainerGap())
        );

        jTabbedPane1.addTab("Instalados", pluginsPanel);

        getContentPane().add(jTabbedPane1, java.awt.BorderLayout.CENTER);

        jMenu1.setText("File");

        jMenuItem4.setText("Exit");
        jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem4ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem4);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Tool");

        jMenuItem1.setText("Settings");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem1);

        jMenuBar1.add(jMenu2);

        jMenu3.setText("Help");

        jMenuItem2.setText("Help contents");
        jMenu3.add(jMenuItem2);
        jMenu3.add(jSeparator6);

        jMenuItem3.setText("About");
        jMenu3.add(jMenuItem3);

        jMenuBar1.add(jMenu3);

        setJMenuBar(jMenuBar1);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jTabbedPane1StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jTabbedPane1StateChanged
        // TODO add your handling code here:
        if (jTabbedPane1.getTitleAt(jTabbedPane1.getSelectedIndex()).equals("Instalados")) {
            try {
                Helper.cleanTree(jTree2);
                Helper.loadPluginsOnTree(jTree2, null);
                Helper.expandAll(jTree2, true);
            } catch (Exception ex) {
                ex.printStackTrace();
            }

        }
    }//GEN-LAST:event_jTabbedPane1StateChanged

    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jTextField1ActionPerformed

        try {
            // TODO add your handling code here:
            String text = this.jTextField1.getText();
            Helper.cleanTree(jTree2);
            ((DefaultTreeModel) jTree2.getModel()).reload();
            Helper.loadPluginsOnTree(jTree2, PluginsManager.getLocalPluginsByFilter(text));
            Helper.expandAll(jTree2, true);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }//GEN-LAST:event_jTextField1ActionPerformed

    

    private void jTree2ValueChanged(javax.swing.event.TreeSelectionEvent evt) {//GEN-FIRST:event_jTree2ValueChanged
        // TODO add your handling code here:
        //check if a node is selected
        if (evt.getNewLeadSelectionPath() == null
                || evt.getNewLeadSelectionPath().toString().split(", ").length != 3) {
            clearForm();
        } else {
            try {
                String s[] = Helper.treePathToStringArray(evt.getNewLeadSelectionPath());

                Plugin p = Helper.getPluginByStrings(s[1], s[2]);

                this.jTextField3.setText(p.getName());
                this.jTextField4.setText(p.getOS());
                this.jTextField5.setText(p.getCategory());
                this.jTextField6.setText(p.getLastUpdated());
                this.jTextField7.setText(p.getAuthor());
                this.jTextArea2.setText(p.getDescription());
                
                Vector<Tag> tags = p.getTags();
                String text = "";
                for(int i = 0;i<tags.size();i++){
                    text += tags.get(i).getName();
                    if(i < tags.size()-1) text += ", ";
                }
                this.jTextArea1.setText(text);

            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }//GEN-LAST:event_jTree2ValueChanged

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        // TODO add your handling code here:
        if (DownloadsHandler.getCurrentDownloads() != 0) {
            javax.swing.JOptionPane.showMessageDialog(null, "Hay descargas en curso",
                    "Error", JOptionPane.ERROR_MESSAGE);
        } else {
            System.exit(0);
        }
    }//GEN-LAST:event_formWindowClosing

    public void loadRemotePluginList(Vector<Plugin> vec) {
        javax.swing.table.DefaultTableModel model = (javax.swing.table.DefaultTableModel) jTable1.getModel();
        for (Plugin p : vec) {
            String action = (p.isRemoteNewer()) ? "Update" : "Install";
            model.addRow(new Object[]{p.getName(), p.getCategory(), p.getLastUpdated(), action});
        }
    }

    public void deleteAllRows() {
        /*DefaultTableModel model = (DefaultTableModel) jTable1.getModel();
        model.getDataVector().removeAllElements();
        model.setRowCount(0);*/
        jTable1.setModel(new javax.swing.table.DefaultTableModel(
                new Object[][]{},
                new String[]{
                    "Nombre", "Category", "Last updated", "Accion"
                }));
        new MyButtonCell(this.jTable1, this, 3);
    }

    private void jButton12ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton12ActionPerformed
        //clean old rows
        deleteAllRows();
        //
        jProgressBar3.setVisible(!jProgressBar3.isVisible());
        try {
            Vector<Plugin> vec = PluginsManager.getRemotePlugins(true);
            loadRemotePluginList(vec);
        } catch (Exception ex) {
            ex.printStackTrace();
        }

        jProgressBar3.setVisible(!jProgressBar3.isVisible());

    }//GEN-LAST:event_jButton12ActionPerformed

    public void updateRemainingTechs(int techs) {
        analisisFeedbackPanel.getTecnicasTerminadas().setText(Integer.toString(techs));
        analisisFeedbackPanel.getProgresoTecnicas().setValue(techs);
        if (techs == analisisFeedbackPanel.getProgresoTecnicas().getMaximum()) {
            previousButton.setEnabled(true);
        }
    }

    public void setTotalTechs(int techs) {
        analisisFeedbackPanel.getTotalTecnicas().setText(Integer.toString(techs));
        analisisFeedbackPanel.getProgresoTecnicas().setMaximum(techs);
    }

    private void jTabbedPane1MouseWheelMoved(java.awt.event.MouseWheelEvent evt) {//GEN-FIRST:event_jTabbedPane1MouseWheelMoved
        // TODO add your handling code here:

        int y = evt.getY();
        if (y > 29) {
            return;
        }

        if (evt.getWheelRotation() > 0) {
            if (jTabbedPane1.getSelectedIndex() < jTabbedPane1.getTabCount() - 1) {
                jTabbedPane1.setSelectedIndex(jTabbedPane1.getSelectedIndex() + 1);
            }
        } else {
            if (jTabbedPane1.getSelectedIndex() > 0) {
                jTabbedPane1.setSelectedIndex(jTabbedPane1.getSelectedIndex() - 1);
            }
        }
    }//GEN-LAST:event_jTabbedPane1MouseWheelMoved

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        // TODO add your handling code here:
        //Settings.main(null);
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem4ActionPerformed
        // TODO add your handling code here:
        formWindowClosing(null);
    }//GEN-LAST:event_jMenuItem4ActionPerformed

    private void jTree2MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTree2MouseReleased
        // TODO add your handling code here:
        TreePath selPath = jTree2.getPathForLocation(evt.getX(), evt.getY());
        if (selPath == null) {
            return;
        } else {
            jTree2.setSelectionPath(selPath);
        }
        if (evt.isPopupTrigger()) {
            jPopupMenu1.show((Component) evt.getSource(), evt.getX(), evt.getY());
        }
    }//GEN-LAST:event_jTree2MouseReleased

    private void jTree2MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTree2MousePressed
        // TODO add your handling code here:
        TreePath selPath = jTree2.getPathForLocation(evt.getX(), evt.getY());
        if (selPath == null || selPath.getPathCount() != 3) {
            return;
        } else {
            jTree2.setSelectionPath(selPath);
        }
        if (evt.isPopupTrigger()) {
            jPopupMenu1.show((Component) evt.getSource(), evt.getX(), evt.getY());
        }
    }//GEN-LAST:event_jTree2MousePressed

    private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem5ActionPerformed
        // TODO add your handling code here:
        String path = jTree2.getSelectionPath().toString();
        path = path.replaceAll(", ", " ");
        path = path.replaceAll("\\[", " ");
        path = path.replaceAll("\\]", " ");
        path = path.trim();
        String[] s = path.split(" ");
        try {

            PluginsManager.delete(Constants.getDirectorioPlugins()
                    + File.separator + s[1] + File.separator + s[2] + ".xml");
            Helper.cleanTree(jTree2);
            Helper.loadPluginsOnTree(jTree2, null);
            Helper.expandAll(jTree2, true);
        } catch (Exception ex) {
            Logger.getLogger(Window.class.getName()).log(Level.SEVERE, null, ex);
        }

    }//GEN-LAST:event_jMenuItem5ActionPerformed

    private void previousButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_previousButtonActionPerformed
        // TODO add your handling code here:
        cancelButton.setEnabled(false);

        if (!nextButton.isEnabled() && panelSelected != panels.length - 1) {
            nextButton.setEnabled(true);
        }
        if (panelSelected == panels.length - 1) {
            startButton.setEnabled(true);
        } else {
            startButton.setEnabled(false);
        }

        if (panelSelected == 0) {
            return;
        }
        stepsPanel.remove(panels[panelSelected]);
        panelSelected--;
        stepsPanel.add(panels[panelSelected], java.awt.BorderLayout.CENTER);
        if (panelSelected == 0) {
            previousButton.setEnabled(false);
        }
        this.repaint();
}//GEN-LAST:event_previousButtonActionPerformed

    private void startButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startButtonActionPerformed
        try {
            // TODO add your handling code here:
            if (!checkStep(4)) {
                return;
            }
            stepsPanel.remove(panels[panelSelected]);
            panelSelected++;
            stepsPanel.add(panels[panelSelected], java.awt.BorderLayout.CENTER);
            startButton.setEnabled(false);
            previousButton.setEnabled(false);
            cancelButton.setEnabled(true);

            this.repaint();

            //analisis configure
            Analisis.clean();
            Analisis.setPlugins(pluginSelectionPanel.getSelectedPlugins());
            Analisis.setPartitions(deviceSelectionPanel.getPartitionsVector());
            Analisis.setIgnoreFileContentTechniques(ignoreOptionsPanel.isCheckBoxFileContentSelected());
            Analisis.setIgnoreMD5HashTechniques(ignoreOptionsPanel.isCheckBoxHashMD5Selected());
            Analisis.setIgnoreSHA1HashTechniques(ignoreOptionsPanel.isCheckBoxHashSHA1Selected());
            Analisis.setIgnoreFindFileTechniques(ignoreOptionsPanel.isCheckBoxFindFileTechniqueSelected());
            Analisis.setIgnoreRecursiveTechniques(ignoreOptionsPanel.isCheckBoxRecursiveSearchSelected());

            try {
                analisisFeedbackPanel.setAutoScrollDown(true);
                analisisFeedbackPanel.getFeedBackPane().setText("");
                Analisis.execute(this);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
}//GEN-LAST:event_startButtonActionPerformed

    private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelButtonActionPerformed
        // TODO add your handling code here:
        Analisis.stop();
        previousButton.setEnabled(true);
}//GEN-LAST:event_cancelButtonActionPerformed

    private void nextButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextButtonActionPerformed
        try {
            // TODO add your handling code here:

            if (!checkStep(panelSelected + 1)) {
                return;
            }
            if (!previousButton.isEnabled()) {
                previousButton.setEnabled(true);
            }
            if (panelSelected == panels.length - 1) {
                return;
            }
            stepsPanel.remove(panels[panelSelected]);
            panelSelected++;
            stepsPanel.add(panels[panelSelected], java.awt.BorderLayout.CENTER);
            if (panelSelected == panels.length - 2) {
                nextButton.setEnabled(false);
                startButton.setEnabled(true);
            }
            this.repaint();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
}//GEN-LAST:event_nextButtonActionPerformed

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // TODO add your handling code here:
        CreateFilter.createFilter(jTextField1);
    }//GEN-LAST:event_jButton1ActionPerformed

    private void jLabel2MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jLabel2MouseClicked
        // TODO add your handling code here:
        jTextField1.setText("");
        jTextField1.postActionEvent();
    }//GEN-LAST:event_jLabel2MouseClicked

    private void clearForm() {
        this.jTextField3.setText("");
        this.jTextField4.setText("");
        this.jTextField5.setText("");
        this.jTextField6.setText("");
        this.jTextField7.setText("");
        this.jTextArea2.setText("");
    }

    private void cleanLeafs(JTree tree) {
    }

    private boolean checkStep(int step) throws Exception {
        if (omitCheckStep) {
            return true;
        }
        switch (step) {
            case 1:
                return checkStep1();
            case 2:
                return checkStep2();
            case 3:
                return checkStep3();
            case 4:
                return checkStep4();
        }
        return false;


    }

    private boolean checkStep1() throws Exception {
        if(firstStepPanel.checkPanel()){
            deviceSelectionPanel.loadDevices();
            return true;
        }else
            return false;
    }

    private boolean checkStep2() throws Exception {
        boolean valid = deviceSelectionPanel.checkPanel();
        if (valid) {
            pluginSelectionPanel.init();
        }

        return valid;
    }

    private boolean checkStep3() throws Exception {
        return pluginSelectionPanel.checkPanel();
    }

    private boolean checkStep4() {
        return true;
    }

    public void printAnalisisMessage(String s, Color color){
        analisisFeedbackPanel.printAnalisisMessage(s, color);
    }

    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) throws Exception {
        /*java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {*/
        new Window().setVisible(true);
        /* }
        });*/


    }
    private Point mousePoint = null;
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton cancelButton;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton12;
    private javax.swing.JButton jButton7;
    private javax.swing.JComboBox jComboBox1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel17;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPopupMenu jPopupMenu1;
    private javax.swing.JProgressBar jProgressBar3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane6;
    private javax.swing.JSeparator jSeparator6;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextArea jTextArea2;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JTextField jTextField3;
    private javax.swing.JTextField jTextField4;
    private javax.swing.JTextField jTextField5;
    private javax.swing.JTextField jTextField6;
    private javax.swing.JTextField jTextField7;
    private javax.swing.JTree jTree2;
    private javax.swing.JButton nextButton;
    private javax.swing.JPanel pluginsPanel;
    private javax.swing.JButton previousButton;
    private javax.swing.JButton startButton;
    private javax.swing.JPanel stepsPanel;
    private javax.swing.JPanel updatePanel;
    // End of variables declaration//GEN-END:variables
}
